package im

import (
	"fmt"
	"encoding/json"
	"dhfshop/models"
	//"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
)

// 自动回复配置
type AutoRspCfg struct {
	AutoRspCfgId       int64  `orm:"column(auto_rsp_cfg_id);pk;auto" json:"auto_rsp_cfg_id" form:"auto_rsp_cfg_id"`
	PartnerId          int64  `orm:"column(partner_id);index" json:"partner_id" form:"partner_id"`
	AppId              string `orm:"column(app_id);size(32);unique" json:"app_id" form:"app_id"`  //小程序或者公众号appid
    ServiceTypeId      int    `orm:"column(service_type_id);default(2)" json:"service_type_id" form:"service_type_id"`   //公众号类型，1公众号，2小程序   
    // 公众号或小程序进入会话自动回复是否开启: 0:关闭;1:默认通用应答;pay:支付;addwx:加微信好友
	SessionReplyOpen   string     `orm:"column(session_reply_open)" json:"session_reply_open" form:"session_reply_open"`                      
	// 公众号或小程序进入会话自动回复消息类型
	SessionReplyType   string     `orm:"column(session_reply_type)" json:"session_reply_type" form:"session_reply_type"`     
	// 公众号或小程序自动回复内容
	SessionReplyInfo   string     `orm:"column(session_reply_info);type(text)" json:"session_reply_info" form:"session_reply_info"`
	// 公众号或小程序收到消息自动回复是否开启
	RcvmsgReplyOpen    string     `orm:"column(rcvmsg_reply_open)" json:"rcvmsg_reply_open" form:"rcvmsg_reply_open"`           
	// 公众号或小程序收到消息自动回复消息类型
	RcvmsgReplyType    string     `orm:"column(rcvmsg_reply_type)" json:"rcvmsg_reply_type" form:"rcvmsg_reply_type"` 
	// 公众号或小程序自动回复内容
	RcvmsgReplyInfo    string     `orm:"column(rcvmsg_reply_info);type(text)" json:"rcvmsg_reply_info" form:"rcvmsg_reply_info"`
    // 公众号关注自动回复是否开启
	SubscribeReplyOpen string  `orm:"column(subscribe_reply_open)" json:"subscribe_reply_open" form:"subscribe_reply_open"`
	// 公众号关注自动回复消息类型
	SubscribeReplyType string  `orm:"column(subscribe_reply_type)" json:"subscribe_reply_type" form:"subscribe_reply_type"`
	// 公众号关注自动回复内容
	SubscribeReplyInfo string  `orm:"column(subscribe_reply_info);type(text)" json:"subscribe_reply_info" form:"subscribe_reply_info"`
}

//公众号或小程序客服公共消息类型
type TextBody struct {
	Content      string  `json:"content,omitempty"`        //文本消息内容
}
type ImageBody struct {
	MediaId      string  `json:"media_id,omitempty"`       //图片消息的媒体ID
}

type MiniprogrampageBody struct {
	Title        string  `json:"title,omitempty"`          //消息标题
	Appid        string  `json:"appid,omitempty"`          //
	Pagepath     string  `json:"pagepath,omitempty"`       //小程序的页面路径
	ThumbMediaId string  `json:"thumb_media_id,omitempty"` //小程序消息卡片的封面
}
	
//小程序客服独有消息类型
type LinkBody struct {
	Title        string  `json:"title,omitempty"`          //消息标题
	Description  string  `json:"description,omitempty"`    //图文链接消息
	Url          string  `json:"url,omitempty"`            //图文链接消息被点击后跳转的链接
	ThumbUrl     string  `json:"thumb_url,omitempty"`      //图文链接的封面
}

//公众号客服独有消息类型
type VoiceBody struct {
	MediaId      string  `json:"media_id,omitempty"`       //媒体ID
}
type VideoBody struct {
	MediaId      string `json:"media_id"`              // 通过素材管理接口上传多媒体文件得到 MediaId
	ThumbMediaId string `json:"thumb_media_id"`        // 通过素材管理接口上传多媒体文件得到 ThumbMediaId
	Title        string `json:"title,omitempty"`       // 视频消息的标题, 可以为 ""
	Description  string `json:"description,omitempty"` // 视频消息的描述, 可以为 ""
}
type MusicBody struct {
	Title        string `json:"title,omitempty"`       // 音乐标题, 可以为 ""
	Description  string `json:"description,omitempty"` // 音乐描述, 可以为 ""
	MusicURL     string `json:"musicurl"`              // 音乐链接
	HQMusicURL   string `json:"hqmusicurl"`            // 高质量音乐链接, WIFI环境优先使用该链接播放音乐
	ThumbMediaId string `json:"thumb_media_id"`        // 通过素材管理接口上传多媒体文件得到 ThumbMediaId
}

// 图文消息里的 Article
type Article struct {
	Title       string `json:"title,omitempty"`       // 图文消息标题
	Description string `json:"description,omitempty"` // 图文消息描述
	URL         string `json:"url,omitempty"`         // 点击图文消息跳转链接
	PicURL      string `json:"picurl,omitempty"`      // 图文消息的图片链接, 支持JPG, PNG格式, 较好的效果为大图640*320, 小图80*80
}

type NewsBody struct {
	Articles []Article `json:"articles,omitempty"` // 多条图文消息信息, 默认第一个item为大图, 注意, 如果图文数超过8, 则将会无响应
}
type MpnewsBody struct {
	MediaId string `json:"media_id"` // 通过素材管理接口上传多媒体文件得到 MediaId
}
type WxcardBody struct {
	CardId  string `json:"card_id"`
}
//
type ReplyMsg struct {
	*TextBody
	*ImageBody
	*MiniprogrampageBody
	*LinkBody
	*VoiceBody
	*VideoBody
	*MusicBody
	*NewsBody
	*MpnewsBody
	*WxcardBody
}

func init() {
	orm.RegisterModel(new(AutoRspCfg))
}

func InitDefaultAutoRspCfg(partnerId int64,serviceTypeId int, appId string)(err error) {
	if _, err = GetAutoRspCfgByAppId(appId); err == orm.ErrNoRows {
	    defaultReplyCfg := AutoRspCfg{
			PartnerId :       partnerId,
			AppId:            appId,
			ServiceTypeId:    serviceTypeId,
			SessionReplyOpen: "1",
            SessionReplyType: "text",			
			SessionReplyInfo: "", 
			//
			RcvmsgReplyOpen:  "1",
			RcvmsgReplyType:  "text", 
			RcvmsgReplyInfo:  "",
            //
            SubscribeReplyOpen: "1",
            SubscribeReplyType: "text",			
			SubscribeReplyInfo: "",     		
		}
		replyMsg := ReplyMsg{}
		if replyMsg.TextBody == nil {
		   replyMsg.TextBody = new(TextBody)
		}
		replyMsg.TextBody.Content = "您好"
		if msgBody, err := json.Marshal(replyMsg); err == nil {
			defaultReplyCfg.SessionReplyInfo = string(msgBody)
			defaultReplyCfg.RcvmsgReplyInfo = string(msgBody)
			//
			defaultReplyCfg.SubscribeReplyInfo = string(msgBody)
		}
		_, err = AddAutoRspCfg(&defaultReplyCfg)  
	}
	return
}

func AddAutoRspCfg(m *AutoRspCfg) (id int64, err error) {
	o := models.GetDefaultDB()
	id, err = o.Insert(m)
	return id, err
}

func GetAutoRspCfgById(id int64) (v *AutoRspCfg, err error) {
	o := models.GetDefaultDB()
	v = &AutoRspCfg{AutoRspCfgId: id}
	if err = o.Read(v); err == nil {
		return v, nil
	}
	return nil, err
}

func GetAutoRspCfgByAppId(appId string) (v *AutoRspCfg, err error) {
	o := models.GetDefaultDB()
	v = &AutoRspCfg{AppId: appId}
	if err = o.Read(v, "AppId"); err == nil {
		return v, nil
	}
	return nil, err
}

func UpdateAutoRspCfgById(m *AutoRspCfg,param ... string) (err error) {
	o := models.GetDefaultDB()
	v := AutoRspCfg{AutoRspCfgId: m.AutoRspCfgId}
	if err = o.Read(&v); err == nil {
		var num int64
		if num, err = o.Update(m, param...); err == nil {
			fmt.Println("Number of records updated in database:", num)
		}
	}
	return
}

func DeleteAutoRspCfg(id int64) (err error) {
	o := models.GetDefaultDB()
	v := AutoRspCfg{AutoRspCfgId: id}
	if err = o.Read(&v); err == nil {
		var num int64
		if num, err = o.Delete(&v); err == nil {
			fmt.Println("Number of records deleted in database:", num)
		}
	}
	return
}

